package org.holoeverywhere.slider;
import android.content.Context;
import android.content.res.TypedArray;
import android.view.View;
import android.view.ViewGroup;
import org.holoeverywhere.LayoutInflater;
import org.holoeverywhere.widget.BaseExpandableListAdapter;
import org.holoeverywhere.widget.ExpandableListView;
final class SliderMenuExpandableAdapter extends BaseExpandableListAdapter implements IAdapter<ExpandableListView>,
SliderMenu.OnPageChangeListener,
ExpandableListView.OnGroupClickListener,
ExpandableListView.OnChildClickListener,
ExpandableListView.OnGroupExpandListener {
private final int mDefaultTextAppearance;
private final int mDefaultTextAppearanceInverse;
private final LayoutInflater mLayoutInflater;
private final SliderMenu mMenu;
private ExpandableListView mListView;
private int mSelectedPage = 0, mHighlightedPage;
private int[] mDecodedPageTemp = new int[2];
SliderMenuExpandableAdapter(Context context, SliderMenu menu) {
mMenu = menu;
mMenu.internalSetOnPageChangeListener(this);
mLayoutInflater = LayoutInflater.from(context);
TypedArray a = context.obtainStyledAttributes(R.styleable.SliderMenu);
mDefaultTextAppearance = a.getResourceId(
R.styleable.SliderMenu_textAppearanceSliderItem,
R.style.Holo_TextAppearance_Medium);
mDefaultTextAppearanceInverse = a.getResourceId(
R.styleable.SliderMenu_textAppearanceSliderItemInverse,
R.style.Holo_TextAppearance_Medium_Inverse);
a.recycle();
}
@Override
public int getGroupCount() {
return mMenu.mItems.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return getGroup(groupPosition).mSubItems.size();
}
@Override
public SliderItem getGroup(int groupPosition) {
return mMenu.mItems.get(groupPosition);
}
@Override
public SliderSubItem getChild(int groupPosition, int childPosition) {
return getGroup(groupPosition).mSubItems.get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return (groupPosition << 4) | childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
final SliderItem item = getGroup(groupPosition);
if (convertView == null) {
convertView = mLayoutInflater.inflate(item.mCustomLayout != 0 ? item.mCustomLayout
: R.layout.slider_menu_expandable_item, parent, false);
}
SliderMenuGroupIndicatorView groupIndicator = (SliderMenuGroupIndicatorView) convertView.findViewById(R.id.slider_menu_group_indicator);
if (groupIndicator != null) {
groupIndicator.setExpanded(isExpanded);
}
mMenu.decodePage(mHighlightedPage, mDecodedPageTemp);
final boolean selected = groupPosition == mDecodedPageTemp[0];
return mMenu.bindView(item, convertView, selected, mDefaultTextAppearance, mDefaultTextAppearanceInverse);
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
final SliderSubItem item = getChild(groupPosition, childPosition);
if (convertView == null) {
convertView = mLayoutInflater.inflate(item.mCustomLayout != 0 ? item.mCustomLayout
: R.layout.slider_menu_expandable_child_item, parent, false);
}
final int encodedPage = mMenu.encodePage(groupPosition, childPosition);
final boolean selected = encodedPage == mSelectedPage;
return mMenu.bindView(item, convertView, selected, mDefaultTextAppearance, mDefaultTextAppearanceInverse);
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return getChild(groupPosition, childPosition).isSelectable();
}
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
final SliderItem item = getGroup(groupPosition);
final boolean hasSubItems = item.hasSubItems(), hasVisiblePage = item.hasVisiblePage();
// Some logical magic...
if (hasVisiblePage || !hasSubItems) {
mMenu.setCurrentPage(mMenu.encodePage(groupPosition, hasSubItems || !hasVisiblePage ? 0 : SliderMenu.CHILD_INVALID), hasSubItems, !hasVisiblePage || !hasSubItems);
} else {
mHighlightedPage = mMenu.encodePage(groupPosition, SliderMenu.CHILD_INVALID);
notifyDataSetInvalidated();
return false;
}
return hasVisiblePage;
}
private int mLastExpandedGroup = -1;
@Override
public void onGroupExpand(int groupPosition) {
if (mLastExpandedGroup != -1 && mLastExpandedGroup != groupPosition && mMenu.flag(SliderMenu.FLAG_EXPAND_ONE_GROUP)) {
mListView.collapseGroup(mLastExpandedGroup);
}
mLastExpandedGroup = groupPosition;
}
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
mMenu.setCurrentPage(mMenu.encodePage(groupPosition, childPosition), false, true);
return true;
}
@Override
public void bind(ExpandableListView listView) {
mListView = listView;
listView.setAdapter(this);
listView.setOnGroupClickListener(this);
listView.setOnGroupExpandListener(this);
listView.setOnChildClickListener(this);
}
@Override
public void onPageChange(int lastPage, int currentPage) {
mSelectedPage = mHighlightedPage = currentPage;
}
}